package com.aasa.siccosap.dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.aasa.siccosap.bean.ClienteBean;
import com.aasa.siccosap.bean.CuentaCorriente;
import com.aasa.siccosap.bean.NotaCredito;
import com.aasa.siccosap.bean.ParametrosConsultaCuentaCorriente;
import com.aasa.siccosap.bean.PedidoBean;
import com.aasa.siccosap.util.Constantes;

import oracle.jdbc.OracleTypes;

public class ClienteDAO extends ConsultaClienteBaseDAO{

	static Logger logger = Logger.getLogger("ClienteDAO.class");
	public ClienteDAO()	throws accesoDaoException {
		super();
	}
	
	public ClienteDAO(DataSource dataSource) {
		super(dataSource);
	}
	
	public String obtenNombreCliente(String codigo){		
        av_message = null;
        storedProcedure = "begin CONSULTA_CLIENTES_PKG.P_OBTEN_CLIENTE(?,?,?,?); end;";
        
        String strL_nombreCliente = null;
        
        try{
                conn = dataSource.getConnection();
                stmt = conn.prepareCall(storedProcedure);                           
                configuraParametrosTraerNombreClientePorCodigo(codigo);
                stmt.execute();

                av_message = (String)stmt.getObject(1);
                	
                if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){                	
                	strL_nombreCliente = (String)stmt.getObject(2);                        
                }else{
                    return null;
                }
                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(conn, null, stmt);
        }
		
		return strL_nombreCliente;
	}

	private void configuraParametrosTraerNombreClientePorCodigo(String strA_codigo) throws SQLException {
		stmt.registerOutParameter(1, OracleTypes.VARCHAR);
		stmt.registerOutParameter(2, OracleTypes.VARCHAR);
		stmt.setString(3, strA_codigo);
	}
	
	private void configuraParametrosTraerClientePorCodigo(String strA_codigo) throws SQLException {
		stmt.registerOutParameter(1, OracleTypes.VARCHAR);
		stmt.registerOutParameter(2, OracleTypes.VARCHAR);
		stmt.setString(3, strA_codigo);
		stmt.registerOutParameter(4, OracleTypes.VARCHAR);
	}

	public ClienteBean obtenCliente(String strA_codigo) {
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_OBTEN_CLIENTE(?,?,?,?); end;";
        
        ClienteBean objL_cliente = null;
        String strL_nombre = null;
        String strL_ruc = null;
        
        try{
                conn = dataSource.getConnection();
                stmt = conn.prepareCall(storedProcedure);                             
                configuraParametrosTraerClientePorCodigo(strA_codigo);                
                stmt.execute();

                av_message = (String)stmt.getObject(1);
                	
                if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){                	
                	strL_nombre = (String)stmt.getObject(2);   
                	strL_ruc = (String)stmt.getObject(4);
                    objL_cliente = new ClienteBean();
                    objL_cliente.setStrPb_codigo(strA_codigo);
                    objL_cliente.setStrPb_nombre(strL_nombre);
                    objL_cliente.setStrPb_ruc(strL_ruc);
                }else{
                    return null;
                }

        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(conn, null, stmt);
        }
		return objL_cliente;
	}
	

	public ClienteBean validaCliente(ClienteBean objA_cliente) {
		av_message = null;
        storedProcedure = "begin CONSULTA_CLIENTES_PKG.P_VALIDA_CLIENTE(?,?,?); end;";
        ResultSet objL_rs = null;
        ClienteBean objL_clienteRes = new ClienteBean();
        try{
                conn = dataSource.getConnection();
                stmt = this.conn.prepareCall(storedProcedure);                              
                configuraParametrosValidaCliente(objA_cliente);               
                stmt.execute();

                av_message = (String)stmt.getObject(1);
                	
                if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                	objL_rs = (ResultSet)stmt.getObject(2);
                	 while(objL_rs.next()){
                		 objL_clienteRes.setStrPb_codigo(objL_rs.getString("COD_CLI"));
                		 objL_clienteRes.setStrPb_nombre(objL_rs.getString("RAZ_SOC"));
                		 objL_clienteRes.setStrPb_ruc(objL_rs.getString("RUC"));
                	 }
                }else{
                    return null;
                }

        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(conn, objL_rs, stmt);
        }
		
		return objL_clienteRes;
	}

	
	private void configuraParametrosValidaCliente(ClienteBean cliente) throws SQLException {
		stmt.registerOutParameter(1, OracleTypes.VARCHAR);
		stmt.registerOutParameter(2, OracleTypes.CURSOR);
		stmt.setString(3, cliente.getStrPb_codigo());
	}

	public ClienteBean consultarVencimientos(String strA_codigo)throws SQLException {
		
		ClienteBean objL_clienteBean = new ClienteBean();
		
		av_message = null;
        storedProcedure = "begin CONSULTA_CLIENTES_PKG.P_CONSULTA_VENCIMIENTO(?,?,?,?,?,?,?,?); end;";
        ResultSet rs = null;       
		
		
		try {
			
			conn = dataSource.getConnection();
            stmt = this.conn.prepareCall(storedProcedure);
                          
            stmt.registerOutParameter(1, OracleTypes.VARCHAR);    
    		stmt.setString(2, strA_codigo);
    		stmt.registerOutParameter(3, OracleTypes.INTEGER);
    		stmt.registerOutParameter(4, OracleTypes.INTEGER);
    		stmt.registerOutParameter(5, OracleTypes.INTEGER);
    		stmt.registerOutParameter(6, OracleTypes.INTEGER);
    		stmt.registerOutParameter(7, OracleTypes.INTEGER);
    		stmt.registerOutParameter(8, OracleTypes.INTEGER);
    		
            stmt.execute();

            av_message = (String)stmt.getObject(1);
            	
            if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
            	
            	objL_clienteBean.setIntPb_numeroGarantias((Integer)stmt.getObject(3));
            	objL_clienteBean.setIntPb_numeroFacturas((Integer)stmt.getObject(4));
            	objL_clienteBean.setIntPb_numeroLetras((Integer) stmt.getObject(5));
            	
            	objL_clienteBean.setIntPb_numeroGarantiasVencidas((Integer)stmt.getObject(6));
            	objL_clienteBean.setIntPb_numeroFacturasVencidas((Integer)stmt.getObject(7));
            	objL_clienteBean.setIntPb_numeroLetrasVencidas((Integer)stmt.getObject(8));
            }else{
                return null;
            }
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		finally{
    		close(conn, rs, stmt);
    }
		
		
		return objL_clienteBean;
	}

	public PedidoBean obtenerEstadoPedido(String strA_numPedido) throws
	SQLException{
		
		av_message = null;
        storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONSULTA_PEDIDO(?,?,?); end;";
        ResultSet objL_rs = null;  
        PedidoBean objL_pedidoBean = new PedidoBean();
				
		try {
			conn = dataSource.getConnection();
            stmt = this.conn.prepareCall(storedProcedure);
            
            configuraParametrosObtenerEstadoPedido(strA_numPedido);
            stmt.execute();

            av_message = (String)stmt.getObject(1);
            	
            if(av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
            	
            	objL_pedidoBean.setStrPb_estadoPedido((String)stmt.getObject(3));
            	
            }else{
                return null;
            }
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		finally{
    		close(conn, objL_rs, stmt);
    }
		
		
		return objL_pedidoBean;
			
		
		
	}
	
    private CallableStatement configuraParametrosObtenerEstadoPedido(String strA_numPedido)
    throws SQLException{
            	
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);    
		stmt.setString(2, strA_numPedido);
		stmt.registerOutParameter(3, OracleTypes.VARCHAR);
    	       
        return(stmt);          
        
    }
    
 	
	
	
}
